package com.tul.exercise.base.jmockit.attestandinjectable;

import mockit.Expectations;
import mockit.Injectable;
import mockit.Tested;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertTrue;

/**
 *  《JMockit中文网》示例 6
 *
 *  @Tested & @Injectable
 *  场景为例：在买家下订单时，电商网站后台程序需要校验买家的身份（是否合法，例如是否在黑名单中），
 *       若下订单没有问题还要发邮件给买家
 *  测试OrderService类的submitOrder方法，在测试过程中，我们并不想真正连结邮件服务器，也不想连结校验用户身份的服务器校验用户身份
 */
public class TestedAndInjectable {
    //@Tested修饰的类，表示是我们要测试对象,在这里表示，我想测试订单服务类。JMockit也会帮我们实例化这个测试对象
    @Tested
    OrderServiceImpl orderService;


    //测试用户ID
    long testUserId = 123456l;
    //测试商品id
    long testItemId = 456789l;

    // 测试注入方式
    @Test
    public void testSubmitOrder(@Injectable MailService mailService,
                                @Injectable UserCheckService userCheckService) {
        new Expectations() {
            {
                // 当向testUserId发邮件时，假设都发成功了
                mailService.sendMail(testUserId, anyString);
                result = true;
                // 当检验testUserId的身份时，假设该用户都是合法的
                userCheckService.check(testUserId);
                result = true;
            }
        };
        // JMockit帮我们实例化了mailService了，并通过OrderService的构造函数，注入到orderService对象中。
        //JMockit帮我们实例化了userCheckService了，并通过OrderService的属性，注入到orderService对象中。
        assertTrue(orderService.submitOrder(testUserId, testItemId));
    }
}
